package main

import (
	"bluebell/controller"
	"bluebell/dao/mysql"
	"bluebell/dao/redis"
	"bluebell/logger"
	"bluebell/pkg/snowflake"
	"bluebell/router"
	"bluebell/setting"
	"fmt"
	"go.uber.org/zap"
)

//gin框架 vue框架

// @title bluebell项目接口文档
// @version 1.0
// @description Go web开发课程设计bluebell

// @contact.name 吴文胜

// @host 127.0.0.1:8080
// @BasePath /api/v1
func main() {
	// 1. 加载配置
	if err := setting.Init(); err != nil {
		fmt.Printf("加载配置失败: %v\n", err)
		return
	}

	fmt.Println("\n===== 应用配置信息 =====")
	fmt.Printf("应用名称: %s\n", setting.Conf.Name)
	fmt.Printf("运行模式: %s\n", setting.Conf.Mode)
	fmt.Printf("端口: %d\n", setting.Conf.Port)
	fmt.Printf("版本: %s\n", setting.Conf.Version)
	fmt.Println("=======================")
	fmt.Println()

	// 2. 初始化日志
	if err := logger.Init(setting.Conf.LogConfig, setting.Conf.Mode); err != nil {
		fmt.Printf(" 初始化日志失败: %v\n", err)
		return
	}

	// 立即使用 zap 记录一条日志
	zap.L().Info("应用开始启动",
		zap.String("version", setting.Conf.Version),
		zap.String("mode", setting.Conf.Mode))

	// 3. 初始化数据库等
	zap.L().Info("初始化MySQL...")
	if err := mysql.Init(setting.Conf.MySQLConfig); err != nil {
		zap.L().Error("初始化MySQL失败", zap.Error(err))
		return
	}
	defer mysql.Close()

	zap.L().Info("初始化Redis...")
	if err := redis.Init(setting.Conf.RedisConfig); err != nil {
		zap.L().Error("初始化Redis失败", zap.Error(err))
		return
	}
	defer redis.Close()

	zap.L().Info("初始化雪花算法...")
	if err := snowflake.Init(setting.Conf.StartTime, setting.Conf.MachineID); err != nil {
		zap.L().Error("初始化雪花算法失败", zap.Error(err))
		return
	}

	zap.L().Info("初始化校验器翻译...")
	if err := controller.InitTrans("zh"); err != nil {
		zap.L().Error("初始化校验器翻译失败", zap.Error(err))
		return
	}

	// 4. 注册路由
	zap.L().Info("初始化路由...")
	r := router.SetupRouter(setting.Conf.Mode)

	// 5. 启动服务器
	addr := fmt.Sprintf(":%d", setting.Conf.Port)
	zap.L().Info(" 启动服务器",
		zap.String("address", addr),
		zap.String("mode", setting.Conf.Mode))

	if err := r.Run(addr); err != nil {
		zap.L().Fatal("启动服务器失败", zap.Error(err))
	}
}
